"""
常用功能
"""
from prettytable import PrettyTable


def pretty_print(title_list, data_list, auto_index=False):
    """
    数据美化打印
    :param title_list: 标题列表
    :param data_list: 数据列表
    :return: None
    """
    tb = PrettyTable(title_list)
    tb.add_rows(data_list)
    if auto_index:
        tb.add_autoindex('编号')
    print(tb)


def input_is_num(input_msg, value_name):
    """
    只能输入数字,直到输入正确为止，返回输入的数字的字符串
    :param input_msg: 输入时打印的信息
    :param value_name: 需要输入值的名字
    :return: 字符串类型的数字
    """
    while True:
        num = input(input_msg).strip()
        # 判断是否为数字
        if not num.isdigit():
            print(f'{value_name}必须为数字，请重新输入!')
            continue
        return num


def get_md5_value(password, pass_salt=None):
    """
    密码加盐
    :param password: 密码
    :return: (加密密文，随机密码盐或传入的密码盐)
    """
    import hashlib
    import random
    # 如果没有传入密码盐，就为注册调用，则生成随机盐
    if not pass_salt:
        # 生成动态盐
        pass_salt = ''
        for i in range(6):
            random_num = str(random.randint(0, 9))
            random_upper = chr(random.randint(65, 90))
            random_lower = chr(random.randint(97, 122))
            temp = random.choice([random_num, random_lower, random_upper])
            pass_salt += temp
    # 计算加密密文
    m = hashlib.md5(password.encode('utf8'))
    m.update(pass_salt.encode('utf8'))
    return m.hexdigest(), pass_salt


def is_positive_num(str_num):
    """
    是否为正数
    :param str_num: 字符串
    :return: 是正数：True 不是：False
    """
    if not str_num.isdigit():
        return False
    if float(str_num) <= 0:
        return False
    return True


def loop_input(msg, error_msg, func, *args):
    """
    循环输入，直至数据正确为止
    :param msg: input打印的消息
    :param error_msg: 输入数据格式错误打印的信息
    :param func: 判断数据是否正确的匿名函数
    :param args: 匿名函数需要的参数
    :return: 符合规范的数据
    """
    while True:
        data = input(msg).strip()
        if func(data, *args):
            return data
        print(error_msg)


def my_isdigit(num_str):
    """
    判断字符串是否为自然数，修复isdigit()不能判断负数
    :param num_str: 数字字符串
    :return: True 或 False
    """
    if not num_str[0] == '-':
        return num_str.isdigit()
    return num_str[1:].isdigit()
